import store from "@/store";
import { MessageBox } from "element-ui";

var websock = null;
var global_callback = null;
var serverPort = "6910"; // webSocket连接端口 //测试
// var serverPort = "6900"; // webSocket连接端口 //正式

function initWebSocket() {
  // 初始化weosocket
  var wsuri = "ws:47.110.142.92:" + serverPort; // 测试
  // var wsuri = "wss:ffcy.stqcm.com:" + serverPort; // 正式

  websock = new WebSocket(wsuri);
  websock.onclose = function(e) {
    websocketclose(e);
  };
  websock.onopen = function() {
    websocketOpen();
  };

  websock.onmessage = function(e) {
    websocketonmessage(e);
  };
  // 连接发生错误的回调方法
  websock.onerror = function() {
    console.log("WebSocket连接发生错误");
  };
}

// 实际调用的方法
function sendSock(agentData, callback) {
  // 检测websokit是否链接成功

  global_callback = callback;
  // 如果登录发送数据 否则 保存发送数据在store里
  // 判断链接是否打开
  if (store.state.socket.socketOpen) {
    console.log("链接已经打开", store.state.socket);
    // 判断是否已登录
    if (
      store.state.socket.loginTransition ||
      store.state.socket.loginAccount ||
      JSON.parse(agentData).api === "api_wxadmin_admin_keepLogin" ||
      JSON.parse(agentData).api === "api_user_index_login" ||
      JSON.parse(agentData).api === "api_wx_user_sendCode" ||
      JSON.parse(agentData).api === "api_user_index_forgetPassword"
    ) {
      websock.send(agentData);
    } else {
      console.log("未登录", agentData);
      store.dispatch("requestCach", agentData);
    }
    // if (
    //
    //   JSON.parse(agentData).api === "api_user_index_login"
    // ) {
    //   websock.send(agentData);
    // } else {
    //   store.dispatch("requestCach", agentData);
    // }
  } else {
    console.log("链接未打开");
    store.dispatch("requestCach", agentData);
  }
}

// 连接成功首先判断是否存在token如存在保持登录
function websocketOpen(e) {
  // const path = {
  //   app: "wxadmin",
  //   api: "api_wxadmin_admin_keepLogin",
  //   version: "1.0",
  //   type: 2,
  //   data: {
  //     token: getToken()
  //   }
  // };
  // websock.send(path);
  store.dispatch("socketOpen", true);
  sendCache();
}

// 数据接收
function websocketonmessage(e) {
  if (global_callback === null) {
    console.log("回调函数不存在");
  } else {
    global_callback(e.data);
  }
}

// 登录成功后判断是否存在缓存数据 如果存在则发送缓存数据
function sendCache() {
  const data = store.state.socket.requestCach;
  delayLog(data, 10);
  store.state.socket.requestCach = [];
}

function head(arr) {
  return arr[0];
}
function tail(arr) {
  return arr.slice(1);
}
function delayLog(arr, n) {
  if (arr.length === 0) {
    void null;
  } else {
    setTimeout(function() {
      websock.send(head(arr));
      delayLog(tail(arr), n + 10);
    }, n);
  }
}

// 关闭
function websocketclose(e) {
  console.log("websocket关闭");
  if (e) {
    console.log("connection closed (" + e.code + ")");
  }
  MessageBox.alert(
    "由于网络原因或其他原因导致链接断开,点击确定重新登陆",
    "连接异常",
    {
      confirmButtonText: "确定",
      callback: action => {
        console.log("action", action);
        // store.dispatch("LogOut").then();
      }
    }
  );
}

// 监听浏览器关闭刷新事件
window.onbeforeunload = function() {
  console.log("浏览器刷新");
};

initWebSocket();

export { sendSock, sendCache };
